package cn.blogsx.reflect;

import cn.blogsx.domain.Person;
import cn.blogsx.domain.Student;

/**
 * 反射：将类的各个组成部分封装为其他对象，这就是反射机制
 *
 * 获取Class的三种方式
 * 1.Class.forName("全类名")：将字节码文件加载进内存，返回class对象
 *      多用于配置文件，将类名定义在配置文件中，读取文件，加载类
 *
 * 2.类名.class : 通过类名的属性class来获取
 *      多用于参数的传递
 *
 * 3.对象.getClass():通过对象的方法，getClass方法在Object中定义着
 *      多用于对象获取字节码的方式
 *
 */
public class Demo1GetClass {
    public static void main(String[] args) throws Exception {
        //1.Class.forName() 静态方法
        Class cls1 = Class.forName("cn.blogsx.domain.Person");
        System.out.println(cls1);
        //2.类名.class
        Class cls2 = Person.class;
        System.out.println(cls2);

        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);

        System.out.println(cls1==cls2);//true
        System.out.println(cls1==cls3);//true

        /**
         * 结论：同一个字节码文件(*.class)在程序运行过程中，只会被加载一次
         * 不论通过那一种方式获取class对象,都是同一个
         */
        Class c = Student.class;
        System.out.println(c==cls1); //false

    }
}
